iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0
自我挑戰組

沒有厲害的頭腦,也能利用腳本實現懶人寫程式的夢想系列 第 16

DAY 16 :PowerShell整合匯出來源物件、匯出腳本及執行腳本

  • 分享至 

  • xImage
  •  

上回我們在PowerShell中使用了多條命令列來幫助我們從SSMS中獲取資料來源物件,這樣做的目的在於我們執行的過程中,我們不需要真的去手動輸入物件的內容,只需要配合工作需求調整我們腳本中命令列的項目,現在我們就嘗試將前幾回的內容合併起來,檢視整個流程是否符合預期,而工作需求比照上回的內容:把A資料庫中所有資料表以及資料內容遷移至B資料庫中。

首先我們先將待會需要的變數先建立起來,如下:

$SERVER = '.'
$SOURCE_DATABASE = 'FirstDataBase'
$TARGET_DATABASE = 'SecondDataBase'
$PATH = "C:\temp" 

接著在上回我們已經使用了命令列成功將資料來源從SSMS取出,語法如下:

#從SSMS將查詢結果匯出,並消除表頭和下方文字
sqlcmd -S . -d FirstDataBase -Q "SET NOCOUNT on;SELECT TABLE_NAME + '' FROM INFORMATION_SCHEMA.TABLES" -o C:\temp\TableName.txt 

#以轉換成另一個檔案,將檔案雜訊移除
findstr /R /C:"^[^-]*$"   C:\temp\TableName.txt  > C:\temp\TableNameList.txt 

#移除不需要的檔案
Remove-Item  C:\temp\TableName.txt

#將檔案存取成變數
$TableNameList = Get-Content C:\temp\TableNameList.txt 

#產出目標資料庫
sqlcmd -S '.' -Q  "CREATE DATABASE $TARGET_DATABASE"

接著我們使用迴圈批次產生及匯入.sql腳本,語法接續如下:

#批次產生.sql腳本
FOR($i=1;$i -lt $TableNameList.Count;$i++)
{
  #將物件去除字串中空白後存成變數
  $FILENAME = $TableNameList[$i] -replace "^\s+|\s+$",""

  #將物件內容匯出成.sql腳本
  mssql-scripter -S . -d $SOURCE_DATABASE  --schema-and-data  --include-objects $FILENAME  --exclude-use-database  --display-progress  -f $PATH\$FILENAME.sql

  #將產生的.sql腳本寫入目標資料庫
  sqlcmd -S '.' -d $TARGET_DATABASE -i $PATH\$FILENAME.sql
}

成功執行後即能在目標資料庫中產生相同的資料表以及資料內容,當然我們也能依照情境作調整,在我的工作內容中會有很多票券冊資料以Table的結構型式存放在資料庫中,這些資料有時多達上百張,並且Table的名稱不是固定的,因此在此種情境下,我就能使用上述的腳本進行作業,當然腳本也能依照許多情境去做改寫。

更多小知識,我們下次見~~


上一篇
DAY 15 :PowerShell利用命令列匯出檔案作為資料來源
下一篇
DAY 17 :接觸單元測試、API整合測試及UI自動化測試的心得
系列文
沒有厲害的頭腦,也能利用腳本實現懶人寫程式的夢想30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言